package Logica.Celdas;

import Graficas.InterfaceGrafica;
import Graficas.Sprite;
import Graficas.SpriteMovements;
import Graficas.SpriteMovementsPrioridad;
import Logica.Mario;
import Logica.Objeto;
import Logica.Personaje;

/**
 * Una celda es una clase que provee todos los metodos comunes a las celdas del
 * juego.
 * 
 * @author Mariano Rodecker
 * @author Matias Varela
 * 
 */
public abstract class Celda extends Objeto {

	/* ################## ATRIBUTOS DE INSTANCIA ######################## */


	// situacion actual en que se encuentra la celda.
	protected boolean inAnimation;

	/* ################## CONSTRUCTORES ######################## */

	/**
	 * Constructor para Celda. Una celda es parte de una InterfaceGrafica y
	 * contiene un SpriteMovement asociado. Se espera que el SpriteMovement
	 * contenga un solo movimiento.
	 * 
	 * @param sizeX
	 *            - dimension de la celda en el eje x
	 * @param sizeY
	 *            - dimension de la celda en el eje y
	 * @param spriteMovements
	 *            - Sprites correspondientes a la celda.
	 * @param ig
	 *            - Interface Grafica que esta asociada a la celda.
	 */
	protected Celda(int sizeX, int sizeY, SpriteMovements sm, InterfaceGrafica ig) {
		super.iniObjeto(sizeX, sizeY, sm, ig);
	}

	/* ################## COMANDOS ######################## */
	
	/**
	 * Realiza las acciones necesarias para poder golpear una celda
	 */
	public void golpear(Mario m) {
	}

	/**
	 * Modifica el estado interno de la celda para reestablecer la situacion
	 * actual de la misma.
	 */
	public void restablecer() {
		inAnimation = false;
	}

	/**
	 * Establece si la celda que recibe el mensaje esta animada.
	 * 
	 * @param t
	 *            - variable booleana que modifica la situacion de animacion de
	 *            la celda.
	 */
	public void setInAnimation(boolean t) {
		inAnimation = t;
	}

	/**
	 * Modifica el estado internno de un Personaje p
	 * 
	 * @param p
	 *            - Personaje a modificar.
	 */
	public abstract void modificar(Personaje p);

	
	
	/**
	 * Rompe una celda.
	 */
	public abstract void romper();
	
	/* ################## CONSULTAS ######################## */

	/**
	 * Retorna si la celda se encuentra esta siendo animada por alguna entidad.
	 * 
	 * @return true si la celda esta animada; false en otro caso.
	 */
	public boolean isInAnimation() {
		return inAnimation;
	}

	/**
	 * Retorna un Sprite actual de la celda. Se considera que una celda tiene un
	 * solo tipo de movimiento para el SpriteMovement.
	 * 
	 * @return un Sprite actual de la celda.
	 */
	public Sprite getSprite() {
		return sm.getSprite(0);
	}
	
	/**
	 * Realiza una clonacion de si misma.
	 * 
	 * @return La celda clonada.
	 */
	public abstract Celda clone();
	
}
